#include <iostream>
#include <typeinfo>
using namespace std;
/**
 * 基础数据类型 
 */
int main() {
  /**
   * 一、整型数据类型（char和bool可认为是一种特殊的整型）
   */
  // 1. 数据类型大小
  // 2 <= short <= int,4 <= long,8 <= long long ( C++标准规定 )
  cout << "================" << "整型大小(字节)" << "================" << endl;
  cout << "int数据类型所占大小:" << sizeof(int) << endl;
  cout << "short数据类型所占大小:" << sizeof(short) << endl;
  cout << "long数据类型所占大小:(不同操作系统和编译器得到结果不一致)" << sizeof(long) << endl;
  cout << "long long数据类型所占大小:" << sizeof(long long) << endl;
  cout << "char数据类型所占大小:" << sizeof(char) << endl;
  cout << "bool数据类型所占大小:" << sizeof(bool) << endl;

  // 2. 数据类型范围（可以用补码解释但是下面的计算更快）
  // 对于有符号整数可以如下计算
  // 0000 0000 0011 0101
  // 2^(-15) ... 2^(0)表示每一个位置代表的数
  // 累计过后就是这个数所代表的整数

  // 对于5️无符号整数可以如下计算
  // 0000 0000 0011 0101
  // 2^(15) ... 2^(0)表示每一个位置代表的数
  // 累计过后就是这个数所代表的整数

  // 3. 数据类型别名
  // int16_t      short
  // uint16_t     unsigned short
  // int32_t      int
  // uint32_t     unsigned int
  // int64_t      long long
  // uint64_t     unsigned long long
  cout << "int16_t数据类型所占大小:" << sizeof(int16_t) << endl;
  cout << "uint16_t数据类型所占大小:" << sizeof(uint16_t) << endl;
  cout << "int32_t数据类型所占大小:" << sizeof(int32_t) << endl;
  cout << "uint32_t数据类型所占大小:" << sizeof(uint32_t) << endl;
  cout << "int64_t数据类型所占大小:" << sizeof(int64_t) << endl;
  cout << "uint64_t数据类型所占大小:" << sizeof(uint64_t) << endl;

  /**
   * 二、字符类型
   */
  // char输出时相比于整型的特殊之处就是输出的时候C++以字符输出
  cout << "================" << "字符型大小(字节)" << "================" << endl;
  cout << "char数据类型所占大小:" << sizeof(char) << endl;
  cout << "unsigned char数据类型所占大小:" << sizeof(unsigned char) << endl;
  cout << "int8_t数据类型所占大小:" << sizeof(int8_t) << endl;
  cout << "uint8_t数据类型所占大小:" << sizeof(uint8_t) << endl;
  char var_c = 97;
  cout << var_c << endl;

  /**
   * 三、布尔类型
   */
  // 布尔型本质就是0和1，其他类型转换为bool也会被转换到0和1
  cout << "================" << "字符型大小(字节)" << "================" << endl;
  cout << "bool数据类型所占大小:" << sizeof(bool) << endl;
  bool var_b1 = true;
  bool var_b2 = false;
  cout << var_b1 << " " << var_b2 << endl;
  // 转换为true，false输出
  cout << boolalpha;
  cout << var_b1 << " " << var_b2 << endl;

  /**
   * 四、浮点数
   */
  // +-1.M*2^E的科学计数表示方法，1位为正负号，E指数，M尾数
  // 类型   大小    指数位    最大范围    尾数位    有效精度
  // |float | 4 | 8   |   3.4*10^38   | 23  | 7   |
  // |double| 8 | 11  |   1.8*10^308  | 52  | 16  |
  cout << "================" << "浮点数大小(字节)" << "================" << endl;
  cout << "float数据类型所占大小:" << sizeof(float) << endl;
  cout << "double数据类型所占大小:" << sizeof(double) << endl;

  /**
   * 五、auto类型
   */
  // auto类型是17的特性，可以自动推断数据类型
  // 使用#include <typeinfo>中的typeid(var_f).name()查看类型名称
  auto var_i = 1;
  auto var_d = 'a';
  auto var_e = true;
  auto var_f = 3.14;
  cout << typeid(var_i).name() << endl;
  cout << typeid(var_d).name() << endl;
  cout << typeid(var_e).name() << endl;
  cout << typeid(var_f).name() << endl;

  return 0;
}